#pragma once
#include <iostream>
#include <cstdio>
#include <set>


class StrCmd
{
public:
    StrCmd()
    {
        _whitelist.insert("ls");
        _whitelist.insert("ps");
        _whitelist.insert("pwd");
        _whitelist.insert("date");
        _whitelist.insert("who");
        _whitelist.insert("cat");
        _whitelist.insert("cd");
    }
    bool CheckWhiteList(const std::string cmd)
    {
        auto it = _whitelist.find(cmd);
        return it == _whitelist.end() ? false : true;
    }
    //解析字符串函数
    std::string ExeC(std::string cmdstr)
    {

        if(!CheckWhiteList(cmdstr))
        {
            return std::string("Command not allowed");
        }
        FILE* fp = popen(cmdstr.c_str(), "r");
        if(fp == nullptr)
        {
            //执行失败
            perror("popen");
            return std::string("Failed to execute command");
        }
        //执行成功
        char buffer[4096];
        std::string result;
        while(true)
        {
            char *ret = ::fgets(buffer,sizeof(buffer),fp);
            if(ret == nullptr) break;
            result += ret; //将读取到的结果追加到result中
        }
        //关闭文件指针
        pclose(fp);
        //失败返回Done，成功返回执行结果
        return result.empty() ? std::string("Done") : result; //返回执行结果
    }
private:
    //白名单，表示可以使用的命令
    std::set<std::string> _whitelist;
};